
package Protocolo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;


public class ConexionServidorACliente extends Thread {
    private Socket clientSocket;
    private BufferedReader entrada;
    private PrintWriter salida;
    private String nombre;
    private boolean conectado;
    private ArrayList<String> usuarios;
    private ArrayList<ObservarProtocolo> observadores;

    public ConexionServidorACliente(Socket s){
        super("ConexionServidorACliente");
        clientSocket = s;
        try{
            entrada = new BufferedReader( new InputStreamReader( clientSocket.getInputStream() ) );
            salida = new PrintWriter(clientSocket.getOutputStream(), true);
            clientSocket.setSoTimeout(0);
            conectado = true;
            observadores = new ArrayList<ObservarProtocolo>();
        }
        catch(SocketException e){
            e.printStackTrace();
        }
        catch(IOException e){
            System.err.println("Fallo la conexion con el cliente");
            e.printStackTrace();
        }
    }
    public void run(){
        try {
            //Protocolo
            //1.Leer nombre de usuario
            nombre = entrada.readLine();
            //2. Enviar bienvenida al usuario
            salida.println("Bienvenido " + nombre);
            //2.Intercambiar mensajes
            while(conectado){
                try {
                    leerMensajeCliente();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
            entrada.close();
            salida.close();
            clientSocket.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private synchronized void leerMensajeCliente()throws InterruptedException, IOException{
        String m;
       while((m=entrada.readLine())== null ){
            wait();
        }
        if(m.startsWith("COMANDO:"))
        {
            String comando = m.split("COMANDO:")[1];
            if(comando.equals("bye")){
                salida.println("Sistema:Hasta pronto");
                System.out.println("El usuario se ha desconectado");
                conectado = false;
                notify();
                return;
            }else if(comando.equals("Lista")){
                setListaUsuarios(usuarios);
            }
        }
        else{
            // Notificar al servidor un mensaje para redistribuir
            for(ObservarProtocolo op: observadores){
                op.recibirMensaje(getNombre(), m);
            }
        }
        notify();
    }

    public void enviarMensaje(String mensaje){
        salida.println(mensaje);
    }
    //por JuanD y Aleja!!!
    public void enviarLista(String lista){
        salida.println(lista);
    }
    public String getNombre(){
        return nombre;
    }
    public void setListaUsuarios(ArrayList<String> nombres){
        this.usuarios=nombres;

        String lista="";
        for(int i=0;i<usuarios.size();i++){
            lista= lista+usuarios.get(i)+";";
         }
         salida.println("LISTAUSUARIOS:"+lista);
    }

    public void agregarObservador(ObservarProtocolo obs){
        observadores.add(obs);
    }
}
